package packageServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import packageComune.ClientHandler;
import packageComune.ClientProxy;




public class MainServer {

	/**
	 * Metodo-scorciatoia usato per non lanciare un eccezioni ogni volta che si legge da
	 * un System.in.
	 * Si invoca invece solo questo metodo che gestisce le eventuali eccezioni di questo tipo.
	 * 
	 * @return Ritorna il testo ricevuto dal System.in.
	 */
	public static String inputTast(){
		BufferedReader br;
		
		br = new BufferedReader(new InputStreamReader(System.in));
		String testo=null;
		try
	      { testo = br.readLine();} catch (IOException e){System.out.println ("errore di flusso");}
	
	      return testo;
	}
	
	
	public static void main(String[] args) {
		
		int scelta;		
		Server server=null;		
		ClientProxy clProxy=new ClientProxy();
				
		
	do{
		System.out.println("Server> Scegli il tipo di comunicazione:");
		System.out.println("1-Socket");
		System.out.println("2-RMI");
		scelta=Integer.parseInt(inputTast());
		if(scelta!=1&&scelta!=2 )
			System.out.println("Scelta non consentita");
			System.out.println();
	}while((scelta!=1)&&(scelta!=2));
		//richiesta del tipo di comunicazione con controllo sulla scelta numerica
		
		switch(scelta)
		{
		case 1: 
			do{
				System.out.println("Con che mappa vuoi giocare:\n1-Casuale\n2-Caricata da File");
				scelta=Integer.parseInt(inputTast());
				if(scelta!=1&&scelta!=2&&scelta!=3)
					System.out.println("La tua scelta non va bene.");	
				}while((scelta!=1)&&(scelta!=2));
			if(scelta==1)
				try {
					server=new Server("casuale");
				} catch (RemoteException e1) {
					e1.printStackTrace();
				}
			else
				try {
					server=new Server("caricata");
				} catch (RemoteException e1) {
					e1.printStackTrace();
				}
			do{
					System.out.println("Scelta partita:\n1-Nuova Partita\n2-Ripristina Partita");
					scelta=Integer.parseInt(inputTast());
					if(scelta!=1&&scelta!=2&&scelta!=3)
						System.out.println("La tua scelta non va bene.");	
			}while((scelta!=1)&&(scelta!=2));
				if(scelta==2)
					try {
						server.caricaPartita();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				
			clProxy.creaServer();
			System.out.println("Server Avviato!");
			while(true){
				//gestione delle connessioni
				ClientHandler handler=new ClientHandler(clProxy.attesaConn(),server,clProxy);			
				Thread t = new Thread(handler);
		        t.start();
			}	
			
			
			
		case 2: 
			do{
				System.out.println("Con che mappa vuoi giocare:\n1-Casuale\n2-Caricata da File");
				scelta=Integer.parseInt(inputTast());
				if(scelta!=1&&scelta!=2&&scelta!=3)
					System.out.println("La tua scelta non va bene.");	
				}while((scelta!=1)&&(scelta!=2));
			try {
				if(scelta==1)
					server=new Server("casuale");
				else
					server=new Server("caricata");
				
				
				do{
					System.out.println("Scelta partita:\n1-Nuova Partita\n2-Ripristina Partita");
					scelta=Integer.parseInt(inputTast());
					if(scelta!=1&&scelta!=2&&scelta!=3)
						System.out.println("La tua scelta non va bene.");	
				}while((scelta!=1)&&(scelta!=2));
				if(scelta==2)
					try {
						server.caricaPartita();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				
				
				LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
				Naming.bind("rmi://127.0.0.1/server:1999",(Remote) server);
				System.out.println("Server Avviato!");
				
			} catch (RemoteException e) {
				e.printStackTrace();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (AlreadyBoundException e) {		
				e.printStackTrace();
			} 
			
			
			;break;
		}	
		//inizializzazione del server secondo il caso
			
	} //fine main

} //fine classe
